#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVector>
#include <QPluginLoader>
#include <QMdiSubWindow>
#include <QMap>
#include "PluginManager.h"
#include "DockWidgetManager.h"
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
public slots:
    /**
     * @brief 注册widget到指定的QDockWidget
     * @param type 要注册到的QDockWidget类型
     * @param widget 要注册的widget指针
     * @return 注册成功返回true，失败返回false
     * @note 该方法不会自动删除替换掉的widget，调用者需要管理widget的生命周期
     */
    bool registerWidgetToDock(DockWidgetType type, QWidget *widget);
    /**
     * @brief 注册菜单项到主窗口
     * @param menuIndex 菜单索引，表示菜单项的位置
     * @param menuObject 菜单对象指针
     */
    void registerMenuItem(int menuIndex, QObject *menuObject);
    /**
     * @brief 注册widget到图形显示区域
     * @param graphicsGuid 图形的Guid
     * @param titleString 标题名称
     * @param pWidget 要注册的widget指针
     */
    void registerGraphicsDisplayWidget(const QString& graphicsGuid,const QString& titleString, QWidget *pWidget);
    
    /**
     * @brief 注销图形显示窗口
     * @param graphicsGuid 要注销的图形GUID
     */
    void unregisterGraphicsDisplayWidget(const QString& graphicsGuid);
    
    /**
     * @brief 切换到指定的图形显示窗口
     * @param graphicsGuid 要切换到的图形GUID
     */
    void switchToGraphicsDisplayWidget(const QString& graphicsGuid);
private slots:
    // 标题栏按钮槽函数
    void onToolButtonMiniClicked();
    void onToolButtonMaxClicked();
    void onToolButtonCloseClicked();
    
    // 窗口状态变化槽函数
    void onWindowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState);
private:
    /**
     * @brief 初始化Dock标题使用自定义的标题代替
     */
    void initDockTitle();
    
    // 重写鼠标事件处理函数
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    
private:
    Ui::MainWindow *ui;
    //< 插件管理模块实例
    PluginManager *m_pPluginManager;
    // 主工作区域控件
    DockWidgetManager* m_pDockWidgetManager;
    // 当前选中的图像GUID
    QString m_currentSelectedGuid;
    // 鼠标按下状态
    bool m_bPressed;
    // 鼠标按下位置
    QPoint m_pointMove;
};
#endif // MAINWINDOW_H
